

#include "bsanclada.h"
#include "coord.h"
#include <vector>


/*
 * Construye una curva bsplien con una cantidad "puntos" de puntos de control
 *
 * Contruye una Bspline en la que se fuerza que los extremos de la curva
 *  interpolen los puntos de control extremos.
 *
 * */       
BsplineAnclada::BsplineAnclada(const std::vector<Coord> &pcontrol)  {
   validarIntegridad(pcontrol);
   int puntos = pcontrol.size();

   int puntosExt;
   int extras;

   extras = grado() - 1;
   puntosExt = puntos+(2*extras);

   this->pcontrol.reserve(puntosExt);

   //pc                       0  1  2  3  ... puntos-2  puntos-1
   //
   //pcAcopiar                0  0  1  2  ... puntos-2 puntos-1 puntos-1  

   for(int i = 0; i < extras; ++i){
      this->pcontrol.push_back(pcontrol[0]);
      this->pcontrol[i] = pcontrol[0];
   }

   for(int i = 0; i < puntos; ++i) {
      this->pcontrol.push_back(pcontrol[i]);
   }

   for(int i = puntosExt - extras - 1; i < puntosExt; ++i){
      this->pcontrol.push_back(pcontrol[puntos - 1]);
   }


}

BsplineAnclada::~BsplineAnclada() { }

Coord BsplineAnclada::centro() const {
   Coord c;
   int cant = 0;
   int fin = pcontrol.size() - (grado() - 2);
   for(int i = (grado()-2); i < fin; ++i){
      c += pcontrol[i];
   }

   cant = (pcontrol.size() - 2*(grado()-2));

   return c * (1.0/cant);
}


